package managedbeans;

import java.io.Serializable;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import factoryService.FactoryService;
import model.Agenda;
import model.Categoria;
import model.Despesa;
import model.ParcelaDespesa;
import model.ParcelaReceita;
import model.Receita;
import model.Usuario;

@ManagedBean
public class BeanPrincipal implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 8853018020451141538L;
	/**
	 * 
	 */
	private String tipo;
	private Receita receita;
	private Despesa despesa;
	private ParcelaReceita parcelaReceita;
	private ParcelaDespesa parcelaDespesa;
	private Usuario usuario;
	private List<Categoria> listaCategoria;
	private List<ParcelaReceita> listaParcelaReceita;
	private List<ParcelaDespesa> listaParcelaDespesa;
	private List<Agenda> listaAgenda;
	private String descricao;
	private Float valor;
	private Categoria categoria;
	private Date data = new Date();
	private String tipoPeriodo = "2";
	private String periodo = "1";
	private String valorReceita;
	private String valorDespesa;
	private String valorSaldo;
	private String tipoPeriodo2 = "2";
	private String periodo2 = "2";
	private String cor;
	private Date servidorData;
	private String opcao = FacesContext.getCurrentInstance()
			.getExternalContext().getRequestParameterMap().get("lancamento");
	private Double valorAtual;
	private Double valorAtual2;
	private DecimalFormat decimal;

	public BeanPrincipal() {
		servidorData = new Date(System.currentTimeMillis());
		if (usuario == null) {
			usuario = (Usuario) FacesContext.getCurrentInstance()
					.getExternalContext().getSessionMap().get("usuario");
		}
		if (receita == null) {
			receita = new Receita();
		}
		if (despesa == null) {
			despesa = new Despesa();
		}
		if (parcelaReceita == null) {
			parcelaReceita = new ParcelaReceita();
		}
		if (parcelaDespesa == null) {
			parcelaDespesa = new ParcelaDespesa();
		}
		
		receita.setUsuario(usuario);
		despesa.setUsuario(usuario);
		parcelaReceita.setUsuario(usuario);
		parcelaDespesa.setUsuario(usuario);
		setListaCategoria(FactoryService.getCategoriaService().findAllByNome(
				usuario.getCodigo()));

		atualizaBalanco();
		
		Calendar c = Calendar.getInstance();
		c.setTime(servidorData);
		c.set(Calendar.HOUR_OF_DAY, 22);
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 0);
		listaAgenda = FactoryService.getAgendaService().procuraAgendaHoje(usuario.getCodigo(), c.getTime());
		
	

	}

	public void atualizaBalanco() {
		decimal = new DecimalFormat("0.00");
		valorAtual = FactoryService.getParcelaReceitaService()
				.resultParcelaReceitaEntreDatas(servidorData,
						usuario.getCodigo());
		if (valorAtual != null) {
			valorReceita = decimal.format(valorAtual);
		}
		valorAtual2 = FactoryService.getParcelaDespesaService()
				.resultParcelaDespesaEntreDatas(servidorData,
						usuario.getCodigo());
		if (valorAtual2 != null) {
			valorDespesa = decimal.format(valorAtual2);
		}
		if (valorAtual != null && valorAtual2 != null) {
			valorSaldo = decimal.format((valorAtual - valorAtual2));
			double a = (valorAtual - valorAtual2);
			if (a < 0) {
				cor = "#f50303";
			} else {
				cor = "#009e18";
			}
		}

		listaParcelaReceita = FactoryService.getParcelaReceitaService()
				.listaParcelaReceitaEntreDatas(servidorData,
						usuario.getCodigo());
		listaParcelaDespesa = FactoryService.getParcelaDespesaService()
				.listaParcelaDespesaEntreDatas(servidorData,
						usuario.getCodigo());
	}

	public void setaReceita() {
		receita.setDescricao(descricao);
		receita.setValor(valor);
		receita.setCategoria(categoria);
		receita.setData(data);

	}

	public void setaDespesa() {
		despesa.setDescricao(descricao);
		despesa.setValor(valor);
		despesa.setCategoria(categoria);
		despesa.setData(data);
	}

	public void setaParcelaReceita() {
		parcelaReceita = new ParcelaReceita();
		parcelaReceita.setReceita(receita);
		parcelaReceita.setUsuario(usuario);
		parcelaReceita.setValor(receita.getValor());
		parcelaReceita.setDataParcela(receita.getData());
	}

	public void setaParcelaDespesa() {
		parcelaDespesa = new ParcelaDespesa();
		parcelaDespesa.setDespesa(despesa);
		parcelaDespesa.setUsuario(usuario);
		parcelaDespesa.setValor(despesa.getValor());
		parcelaDespesa.setDataParcela(despesa.getData());
	}

	public void novoLancar() {
		descricao = null;
		valor = null;
		data = new Date();
		tipo = null;
		opcao = null;
		tipoPeriodo = "2";
		tipoPeriodo2 = "2";
		periodo = "1";
		periodo2 = "2";
	}

	public String iconeCompensado(String c) {
		if (c.contains("Sim")) {
			return "icone/circle_green.png";
		} else {
			return "icone/circle_red.png";
		}
	}


	public void salvarReceitaDespesa() {
		// RECEITA
		if (tipo.contains("1")) {
			setaReceita();

			if (opcao != null && opcao.contains("0")) {
				FactoryService.getReceitaService().salvar(receita);
				setaParcelaReceita();
				FactoryService.getParcelaReceitaService()
						.salvar(parcelaReceita);
			}

			if (opcao != null && opcao.contains("1")) {
				setaParcelaReceita();
				if (tipoPeriodo != null && tipoPeriodo.contains("1")) {
					FactoryService.getReceitaService().salvar(receita);
					FactoryService.getParcelaReceitaService().fixoSemanal(
							parcelaReceita, Integer.parseInt(periodo));

				}

				if (tipoPeriodo != null && tipoPeriodo.contains("2")) {
					FactoryService.getReceitaService().salvar(receita);
					FactoryService.getParcelaReceitaService().fixoMensal(
							parcelaReceita, Integer.parseInt(periodo));
				}

				if (tipoPeriodo != null && tipoPeriodo.contains("3")) {
					FactoryService.getReceitaService().salvar(receita);
					FactoryService.getParcelaReceitaService().fixoSemestral(
							parcelaReceita, Integer.parseInt(periodo));
				}

			}

			if (opcao != null && opcao.contains("2")) {
				setaParcelaReceita();
				receita.setNumeroParcelas("/" + periodo2);
				if (tipoPeriodo2 != null && tipoPeriodo2.contains("1")) {
					FactoryService.getReceitaService().salvar(receita);
					FactoryService.getParcelaReceitaService()
							.geraParcelaSemanal(parcelaReceita,
									Integer.parseInt(periodo2));
				}

				if (tipoPeriodo2 != null && tipoPeriodo2.contains("2")) {
					FactoryService.getReceitaService().salvar(receita);
					FactoryService.getParcelaReceitaService()
							.geraParcelaMensal(parcelaReceita,
									Integer.parseInt(periodo2));
				}

				if (tipoPeriodo2 != null && tipoPeriodo2.contains("3")) {
					FactoryService.getReceitaService().salvar(receita);
					FactoryService.getParcelaReceitaService()
							.geraParcelaSemestral(parcelaReceita,
									Integer.parseInt(periodo2));
				}

				if (tipoPeriodo2 != null && tipoPeriodo2.contains("4")) {
					FactoryService.getReceitaService().salvar(receita);
					FactoryService.getParcelaReceitaService().geraParcelaAnual(
							parcelaReceita, Integer.parseInt(periodo2));
				}
			}
		}

		// DESPESA
		if (tipo.contains("2")) {
			setaDespesa();
			if (opcao != null && opcao.contains("0")) {
				FactoryService.getDespesaService().salvar(despesa);
				setaParcelaDespesa();
				FactoryService.getParcelaDespesaService()
						.salvar(parcelaDespesa);
			}

			if (opcao != null && opcao.contains("1")) {

				setaParcelaDespesa();
				if (tipoPeriodo != null && tipoPeriodo.contains("1")) {
					FactoryService.getDespesaService().salvar(despesa);
					FactoryService.getParcelaDespesaService().fixoSemanal(
							parcelaDespesa, Integer.parseInt(periodo));
				}

				if (tipoPeriodo != null && tipoPeriodo.contains("2")) {
					FactoryService.getDespesaService().salvar(despesa);
					FactoryService.getParcelaDespesaService().fixoMensal(
							parcelaDespesa, Integer.parseInt(periodo));
				}

				if (tipoPeriodo != null && tipoPeriodo.contains("3")) {
					FactoryService.getDespesaService().salvar(despesa);
					FactoryService.getParcelaDespesaService().fixoSemestral(
							parcelaDespesa, Integer.parseInt(periodo));
				}

			}

			if (opcao != null && opcao.contains("2")) {
				setaParcelaDespesa();
				despesa.setNumeroParcelas("/" + periodo2);
				if (tipoPeriodo2 != null && tipoPeriodo2.contains("1")) {
					FactoryService.getDespesaService().salvar(despesa);
					FactoryService.getParcelaDespesaService()
							.geraParcelaSemanal(parcelaDespesa,
									Integer.parseInt(periodo2));
				}

				if (tipoPeriodo2 != null && tipoPeriodo2.contains("2")) {
					FactoryService.getDespesaService().salvar(despesa);
					FactoryService.getParcelaDespesaService()
							.geraParcelaMensal(parcelaDespesa,
									Integer.parseInt(periodo2));
				}

				if (tipoPeriodo2 != null && tipoPeriodo2.contains("3")) {
					FactoryService.getDespesaService().salvar(despesa);
					FactoryService.getParcelaDespesaService()
							.geraParcelaSemestral(parcelaDespesa,
									Integer.parseInt(periodo2));
				}

				if (tipoPeriodo2 != null && tipoPeriodo2.contains("4")) {
					FactoryService.getDespesaService().salvar(despesa);
					FactoryService.getParcelaDespesaService().geraParcelaAnual(
							parcelaDespesa, Integer.parseInt(periodo2));
				}
			}
		}
		novoLancar();
		atualizaBalanco();
	}

	// //////GETTERS E SETTERS///
	public Receita getReceita() {
		return receita;
	}

	public void setReceita(Receita receita) {
		this.receita = receita;
	}

	public Despesa getDespesa() {
		return despesa;
	}

	public void setDespesa(Despesa despesa) {
		this.despesa = despesa;
	}

	public ParcelaReceita getParcelaReceita() {
		return parcelaReceita;
	}

	public void setParcelaReceita(ParcelaReceita parcelaReceita) {
		this.parcelaReceita = parcelaReceita;
	}

	public ParcelaDespesa getParcelaDespesa() {
		return parcelaDespesa;
	}

	public void setParcelaDespesa(ParcelaDespesa parcelaDespesa) {
		this.parcelaDespesa = parcelaDespesa;
	}

	public List<Categoria> getListaCategoria() {
		return listaCategoria;
	}

	public void setListaCategoria(List<Categoria> listaCategoria) {
		this.listaCategoria = listaCategoria;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Float getValor() {
		return valor;
	}

	public void setValor(Float valor) {
		this.valor = valor;
	}

	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public String getOpcao() {
		return opcao;
	}

	public void setOpcao(String opcao) {
		this.opcao = opcao;
	}

	public String getTipoPeriodo() {
		return tipoPeriodo;
	}

	public void setTipoPeriodo(String tipoPeriodo) {
		this.tipoPeriodo = tipoPeriodo;
	}

	public String getPeriodo() {
		return periodo;
	}

	public void setPeriodo(String periodo) {
		this.periodo = periodo;
	}

	public Date getservidorData() {
		return servidorData;
	}

	public void setservidorData(Date mData) {
		this.servidorData = mData;
	}

	public String getTipoPeriodo2() {
		return tipoPeriodo2;
	}

	public void setTipoPeriodo2(String tipoPeriodo2) {
		this.tipoPeriodo2 = tipoPeriodo2;
	}

	public String getPeriodo2() {
		return periodo2;
	}

	public void setPeriodo2(String periodo2) {
		this.periodo2 = periodo2;
	}

	public String getValorReceita() {
		return valorReceita;
	}

	public void setValorReceita(String valorReceita) {
		this.valorReceita = valorReceita;
	}

	public String getValorDespesa() {
		return valorDespesa;
	}

	public void setValorDespesa(String valorDespesa) {
		this.valorDespesa = valorDespesa;
	}

	public Double getValorAtual() {
		return valorAtual;
	}

	public void setValorAtual(Double valorAtual) {
		this.valorAtual = valorAtual;
	}

	public String getValorSaldo() {
		return valorSaldo;
	}

	public void setValorSaldo(String valorSaldo) {
		this.valorSaldo = valorSaldo;
	}

	public String getCor() {
		return cor;
	}

	public void setCor(String cor) {
		this.cor = cor;
	}

	public List<ParcelaReceita> getListaParcelaReceita() {
		return listaParcelaReceita;
	}

	public void setListaParcelaReceita(List<ParcelaReceita> listaParcelaReceita) {
		this.listaParcelaReceita = listaParcelaReceita;
	}

	public List<ParcelaDespesa> getListaParcelaDespesa() {
		return listaParcelaDespesa;
	}

	public void setListaParcelaDespesa(List<ParcelaDespesa> listaParcelaDespesa) {
		this.listaParcelaDespesa = listaParcelaDespesa;
	}

	public List<Agenda> getListaAgenda() {
		return listaAgenda;
	}

	public void setListaAgenda(List<Agenda> listaAgenda) {
		this.listaAgenda = listaAgenda;
	}
	
	

}
